﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;

namespace Neturion.Negocios
{
    public class NegocioTransferencia
    {
        private IRepositorioTransferencia _repositorioTransferencia;

        public NegocioTransferencia()
        {
            _repositorioTransferencia = new RepositorioTransferencia();
        }

        public Transferencia Inserir(Transferencia transferencia)
        {
            if (string.IsNullOrEmpty(transferencia.Documento))
            {
                throw new Exception("O Número do Documento é obrigatório!");
            }

            if (transferencia.Valor == 0)
            {
                throw new Exception("Não é permitido salvar Transferência com valor Zerado");
            }

            NegocioContaBanco negocioContaBanco = new NegocioContaBanco();
            negocioContaBanco.VerificarSaldo(transferencia.ContaBancoOrigem, transferencia.Valor);
            negocioContaBanco.Debitar(transferencia.ContaBancoOrigem, transferencia.Valor);
            negocioContaBanco.Creditar(transferencia.ContaBancoDestino, transferencia.Valor);

            transferencia = _repositorioTransferencia.Inserir(transferencia);

            NegocioLancamento negocioLancamento = new NegocioLancamento();
            negocioLancamento.CriarLancamento(transferencia);

            return transferencia;
        }

        public Transferencia Atualizar(Transferencia transferencia)
        {
            return _repositorioTransferencia.Atualizar(transferencia);
        }

        public void Excluir(Transferencia transferencia)
        {
            Transferencia transferenciaTmp = ObterPorId(transferencia.TransferenciaId);
            _repositorioTransferencia.Excluir(transferenciaTmp);
        }

        public IList<Transferencia> ObterTodos()
        {
            return _repositorioTransferencia.ObterTodos();
        }

        public IList<Transferencia> ObterTodos(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string numero, string documento, DateTime? inicioVigenciaDe,
                                                            DateTime? inicioVigenciaAte, ContaBanco contaBancoOrigem, ContaBanco contaBancoDestino, decimal? valorInicio, decimal? valorFim)
        {
            return _repositorioTransferencia.ObterTodos(inicio, quantidade, quantidadeMinima, numero, documento, inicioVigenciaDe, inicioVigenciaAte, contaBancoOrigem, contaBancoDestino, valorInicio, valorFim);
        }

        public Transferencia ObterPorId(int id)
        {
            return _repositorioTransferencia.ObterPorId(id);
        }
    }
}